package com.xbongbong.sys.model;

import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.sys.domain.entity.CompanyConfigEntity;

import java.util.List;
import java.util.Map;

/**
 * @author wufeng
 * @date 2019/1/9 15:23
 */
public interface CompanyConfigModel extends IModel<CompanyConfigEntity> {

    /**
     *  批量插入
     * @author wufeng
     * @date 2019/1/9 15:26
     * @param lists 数据列表
     * @descption
     * @return void
     */
    void insertBatch(List<CompanyConfigEntity> lists);

    /**
     * 保存接口
     * 若entity.getId() == null 或 id == 0 则为新建；
     * 否则为更新
     * @param entity
     * @return
     */
    Integer save(CompanyConfigEntity entity);

    /**
     * CompanyConfigEntity保存，若不存在则新建，存在则更新
     * @param corpid 公司id
     * @param configAlias 配置alias
     * @param name 配置名
     * @param configValue 配置值
     * 创建时间 2019/1/17 3:50 PM
     * 修改时间 2019/1/17 3:50 PM
     * @author chy
     * @since v3.37
     * @version v3.37
     */
    void save(String corpid, String configAlias, String name, String configValue);

    /**
     * 根据key删除信息
     * @param key 数据id
     * @param corpid 公司id
     * @return 返回删除的行数
     */
    Long deleteByKey(Long key, String corpid);

    /**
     * 根据key获取单行数据
     * @param key 数据id
     * @param corpid 公司id
     * @return CompanyConfigEntity
     */
    CompanyConfigEntity getByKey(Long key, String corpid);


    /**
     * 根据配置名称获取单行数据
     * @param configName 配置名称
     * @param corpid 公司id
     * @return CompanyConfigEntity
     */
    CompanyConfigEntity getByConfigName(String configName, String corpid);

    /**
     * 根据配置別名获取单行数据
     * @param configAlias 配置别名
     * @param corpid 公司id
     * @return CompanyConfigEntity
     */
    CompanyConfigEntity getByConfigAlias(String configAlias, String corpid);

    /**
     * 先从缓存里获取，缓存没有再去查表
     * @see com.xbongbong.saas.enums.CompanyConfigEnum
     * @param configAlias 配置的标识
     * @param prefix redis前缀
     * @param key redis的key
     * @param corpid 所属公司id
     * @param time redis存活时间
     * @return
     * @throws XbbException
     */
    String getByConfigAlias(String configAlias, String prefix, String key, String corpid, Integer time);

    String getByConfigAlias(String configAlias, String prefix, String key, String corpid, Integer time, String defaultValue);
    /**
     * 根据配置別名获取该配置所有公司数据，只给脚本用的
     *
     * @param configAlias 英文名
     * @return com.xbongbong.sys.domain.entity.CompanyConfigEntity
     * @author feng.zheng
     * @date 2020/5/14 20:22
     * @since v1.0
     */
    List<CompanyConfigEntity> getByAliasAllCompany4Script(String configAlias);

    /**
     * 取出所有，不分页
     * @param param
     * @return
     */
    List<CompanyConfigEntity> findEntityList(Map<String, Object> param);

    /**
     * 获取配置值
     *
     * @param corpid 公司id
     * @param aliasList 别名列表
     * @author GuoJun.HU
     * @since V1.0
     * @return Map
     * @date 2019/2/18 22:19
     */
    Map<String,String> getConfigValueMap(String corpid, List<String> aliasList);

    /**
     * 根据别名获取公司配置(无配置时使用枚举初始化)
     * @param corpId 公司
     * @param configAlias 配置别名
     * @return
     */
    CompanyConfigEntity initConfigEntity(String corpId, String configAlias) throws XbbException;

    /**
     * 获取财年起始月
     * @param corpId 公司id
     * @return
     */
    int getFiscalStartMonth(String corpId);

    /**
     * 设置财年起始月
     * @param corpId 公司id
     * @param startMonth 开始月份
     * @throws XbbException
     * @return 公司配置实体
     */
    CompanyConfigEntity setFiscalStartMonth(String corpId, Integer startMonth) throws XbbException;

    /**
     * 判断规则是否启用
     * @param corpId 公司id
     * @param configAlias 配置别名
     * @param configValue 配置值，判断开关值 基本都是1
     * @return
     * @throws
     *
     * @author hongxiao
     * @date: 2019-02-17 11:15
     * @since v1.0
     * @version v1.0
     */
    boolean hasBeenEnable(String corpId, String configAlias,String configValue) throws XbbException;

    /**
     * 获取每月工作日天数
     * @param corpId 公司id
     * @return
     * @throws
     *
     * @author hongxiao
     * @date: 2019-02-21 14:11
     * @since v1.0
     * @version v1.0
     */
    Double getWorkingDayMonth(String corpId);

    /**
     * 获取每周工作日天数
     * @param corpId 公司id
     * @return
     * @throws
     *
     * @author hongxiao
     * @date: 2019-02-21 14:12
     * @since v1.0
     * @version v1.0
     */
    Double getWorkingDayWeek(String corpId);

    /**
     * 获取某一个配置 比如移动端设置个人业绩目标权限，or目标配置
     * 1. 对于“移动端设置个人业绩目标权限”，为null则默认有权限 configValue = 1
     * 2. 对于“目标配置”，为null则默认开启所有指标，从枚举PerformanceTypeEnum内获取出所有Index即可
     *
     * @param corpid
     * @param configAlias 通过枚举获取 比如 CompanyConfigEnum.PERFORMANCE_SET.getAlias()，CompanyConfigEnum.PERFORMANCE_TYPES.getAlias()
     * @return
     * @author chuanpeng.zhang
     * @time 2016-8-20 下午3:56:05
     */
    CompanyConfigEntity getConfigEntity(String corpid, String configAlias);

    /**
     * 批量删除
     * @author 吴峰
     * @date 2019/2/26 16:04
     * @param updateUserConfigList
     * @param corpid 公司id
     * @return void
     * @throws XbbException 业务异常
    */
    void updateBatch(List<CompanyConfigEntity> updateUserConfigList, String corpid);

    /**
     * 获取客户查重处的设置
     * @param corpid
     * @param type 1：是否允许抢操作， 2：是否允许加入团队操作
     * @return
     * @author long.rao
     * @date 2019-03-25 09:04
     */
    boolean getDuplicateShowRule(String corpid,Integer type);

    void updateBatch4Script(List<CompanyConfigEntity> companyConfigEntityList);

    /**
     * 获取批次保质期管理
     * @param corpid
     * @return
     */
    Boolean getBatchShelf(String corpid);

    /**
     * 获取序列号管理
     * @param corpid
     * @return
     */
    Boolean getSeqManagement(String corpid);

    /**
     * 获取公司级配置中的最大id
     *
     * @param param
     * @return
     */
    Long getMaxId(Map<String, Object> param);

    /**
     * 根据配置別名获取该配置所有公司corpid，只给脚本用的
     *
     * @param configAlias 英文名
     * @return com.xbongbong.sys.domain.entity.CompanyConfigEntity
     * @author feng.zheng
     * @date 2020/5/14 20:22
     * @since v1.0
     */
    List<String> getByAliasAllCorpids(String configAlias);

    /**
     * 批量删除
     * @param list 公司集合
     * @param configAlias
     * @author xingxing.xiao
     */
    Integer deleteBatchByCorpids4Script(List<String> list, String configAlias);

    Integer hasBeenEnable(String corpid, String alias) throws XbbException;

    /**
     * 根据configAliasList批量更新删除标识
     * @param del
     * @param corpid
     * @param configAliasList
     * @author lijiangren
     * @date 2022-05-17 10 57
     */
    Integer updateBatchDelByConfigAlias(Integer del, String corpid, List configAliasList);

    /**
     * 需要处理的有工作流并且有paas表单的公司！切忌只为了刷脚本使用，其它情况误使用
     *
     * @return
     */
    List<String> getPaasAndWorkflowCorpList();
}
